/**
 * 位置服务工具类
 * 处理位置获取、权限申请和位置解析
 */

// 高德地图Key - 如需使用，请替换为您自己的Key
const AMAP_KEY = 'YOUR_AMAP_KEY_HERE';
const AMAP_API = 'https://restapi.amap.com/v3/geocode/regeo';

/**
 * 获取用户位置
 * @param {Object} options 配置选项
 * @param {String} options.type 坐标类型，默认wgs84
 * @param {Boolean} options.altitude 是否获取高度信息
 * @param {Boolean} options.isHighAccuracy 是否使用高精度定位
 * @param {Number} options.highAccuracyExpireTime 高精度定位超时时间，单位ms
 * @returns {Promise} Promise对象
 */
export function getLocation(options = {}) {
  // 默认配置
  const defaultOptions = {
    type: 'gcj02',
    altitude: false,
    isHighAccuracy: true,
    highAccuracyExpireTime: 5000
  };
  
  // 合并配置
  const mergedOptions = {...defaultOptions, ...options};
  
  return new Promise((resolve, reject) => {
    // 检查权限
    checkLocationPermission()
      .then(() => {
        // 获取位置
        wx.getLocation({
          ...mergedOptions,
          success: (res) => {
            console.log('位置获取成功:', res);
            resolve(res);
          },
          fail: (err) => {
            console.error('位置获取失败:', err);
            reject(err);
          }
        });
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * 检查位置权限
 * @returns {Promise} Promise对象
 */
export function checkLocationPermission() {
  return new Promise((resolve, reject) => {
    wx.getSetting({
      success: (res) => {
        if (res.authSetting['scope.userLocation']) {
          // 已授权
          resolve();
        } else if (res.authSetting['scope.userLocation'] === false) {
          // 已拒绝授权，引导用户开启
          wx.showModal({
            title: '位置权限',
            content: '需要获取您的位置信息，请到设置页面开启位置权限',
            confirmText: '去设置',
            cancelText: '取消',
            success: (modalRes) => {
              if (modalRes.confirm) {
                wx.openSetting({
                  success: (settingRes) => {
                    if (settingRes.authSetting['scope.userLocation']) {
                      resolve();
                    } else {
                      reject(new Error('用户未授权位置权限'));
                    }
                  }
                });
              } else {
                reject(new Error('用户拒绝授权位置权限'));
              }
            }
          });
        } else {
          // 首次获取权限
          resolve();
        }
      },
      fail: (err) => {
        console.error('获取设置失败:', err);
        reject(err);
      }
    });
  });
}

/**
 * 逆地址解析（经纬度转地址）
 * 注意：需要配置高德地图Key
 * @param {Object} location 位置对象，包含经纬度
 * @param {Number} location.latitude 纬度
 * @param {Number} location.longitude 经度
 * @returns {Promise} Promise对象
 */
export function reverseGeocode(location) {
  if (!AMAP_KEY || AMAP_KEY === 'YOUR_AMAP_KEY_HERE') {
    return Promise.reject(new Error('请配置高德地图Key'));
  }
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: AMAP_API,
      data: {
        key: AMAP_KEY,
        location: `${location.longitude},${location.latitude}`,
        extensions: 'all'
      },
      success: (res) => {
        if (res.data && res.data.status === '1') {
          resolve(res.data.regeocode);
        } else {
          reject(new Error('逆地址解析失败'));
        }
      },
      fail: (err) => {
        reject(err);
      }
    });
  });
}

/**
 * 监听实时位置变化
 * @param {Function} callback 回调函数
 */
export function watchLocation(callback) {
  // 检查权限
  checkLocationPermission()
    .then(() => {
      // 开启位置监听
      wx.startLocationUpdate({
        success: () => {
          // 监听位置变化事件
          wx.onLocationChange((res) => {
            if (typeof callback === 'function') {
              callback(res);
            }
          });
        },
        fail: (err) => {
          console.error('开启位置监听失败:', err);
        }
      });
    })
    .catch(err => {
      console.error('位置权限检查失败:', err);
    });
}

/**
 * 停止监听位置
 */
export function stopWatchLocation() {
  wx.stopLocationUpdate({
    success: () => {
      wx.offLocationChange();
    }
  });
}

/**
 * 打开位置选择
 * @returns {Promise} Promise对象
 */
export function chooseLocation() {
  return new Promise((resolve, reject) => {
    // 检查权限
    checkLocationPermission()
      .then(() => {
        // 打开位置选择器
        wx.chooseLocation({
          success: (res) => {
            resolve(res);
          },
          fail: (err) => {
            reject(err);
          }
        });
      })
      .catch(err => {
        reject(err);
      });
  });
} 